package com.zyj.java1;

import java.util.Date;

/**
 * @program: JVMDemo
 * @ClassName LocalVariablesTest
 * @author: YaJun
 * @Date: 2021 - 12 - 07 - 15:32
 * @Package: com.zyj.java.java1
 * @Description:
 */
public class LocalVariablesTest {

    public int count = 0;

    public static void main(String[] args) {
        LocalVariablesTest test = new LocalVariablesTest();
        String a = new String();
        int count = 10;
        System.out.println(count);
    }

    public void t1() {
        LocalVariablesTest test = new LocalVariablesTest();
        String a = new String();
        this.count = 10;
        // double, long 占两个槽
        double b = 11.0;

        long c = 1L;
        Date date = new Date();
        System.out.println(count);
    }

    public void t2() {
        int a = 10;
        {
            int b = a;
            b = 10 + a;
        }
        // 变量c使用之前销毁的变量b占据的slot的位置
        int c = 30;
    }

    /**
     * 变量的分类：
     *  按照数据类型分：基本数据类型  引用数据类型
     *  按照在类中声明的位置分:   成员变量：在使用前，都经历过默认初始化赋值
     *                                 类变量：linking的prepare阶段，给类变量默认赋值 ---> initial阶段：给类变量显示赋值即静态代码块赋值
     *                                 实例变量：随着对象的创建，会在堆空间中分配实例变量空间，并进行默认赋值
     *                          局部变量：在使用前，必须要进行显示赋值！否则，编译不通过。局部变量表会给它slot，但是不会赋值。
     */
    public void t3() {
        int num;
//        System.out.println(num);    // 报错：Variable 'num' might not have been initialized
    }

}
